package com.corpgovernment.common.logging.service;

import java.util.Map;

import com.corpgovernment.common.logging.bo.LogTags;
import com.corpgovernment.common.logging.service.impl.LoggerMessage;
import com.corpgovernment.common.logging.utils.LoggerUtils;
import com.ctrip.corp.obt.generic.utils.StringUtils;

/**
 * @author: pwang27
 * @Date: 2023/11/8 17:34
 * @Description:
 */
public interface LoggerService {

    void info(String title, Object obj);

    /**
     * @param title
     * @param message
     * @param params
     */
    void info(String title, String message, Object... params);

    /**
     * @param title
     * @param obj
     */
    void error(String title, Object obj);

    /**
     * @param title
     * @param message
     * @param params
     */
    void error(String title, String message, Object... params);

    /**
     * @param title
     * @param e
     */
    void error(String title, Throwable e);

    /**
     * @param title
     * @param obj
     */
    void warn(String title, Object obj);

    /**
     * @param title
     * @param message
     * @param params
     */
    void warn(String title, String message, Object... params);

    /**
     * @return log tags
     */
    Map<String, String> getTags();

    /**
     * @param key
     * @param value
     * @return
     */
    LoggerService withTag(String key, Object value);

    /**
     * @param key
     * @return
     */
    LoggerService removeTags(String key);

    /**
     * @return
     */
    LoggerService clearTags();

    /**
     * 设置公共标签
     *
     * @param tagsMap 公共标签集合。
     */
    default LoggerService initTags(Map<String, String> tagsMap) {
        LoggerUtils.initTags(tagsMap);
        return this;
    }

    /**
     * 设置公共标签
     *
     * @param tags 公共标签集合，每2个为一组，不足2个忽略。
     */
    default LoggerService initTags(String... tags) {
        LoggerUtils.initTags(tags);
        return this;
    }

    /**
     * 设置公共标签
     *
     * @param tags 公共标签类
     */
    default LoggerService initTags(LogTags tags) {
        LoggerUtils.initTags(tags);
        return this;
    }

    /**
     * 基础的数据设置
     *
     * @param tag
     * @param tagData
     * @param baseTagData
     */
    default void addTag(String tag, String tagData, String baseTagData) {
        if (StringUtils.isNotBlank(tagData)) {
            withTag(tag, tagData);
            return;
        }

        if (StringUtils.isBlank(baseTagData)) {
            return;
        }
        withTag(tag, baseTagData);
    }

    /**
     * 日志创建模式
     *
     * @param title     日志标题
     * @param message   日志内容
     * @param execption 异常
     */
    LoggerMessage build(String title, Object message, Throwable execption);

    /**
     * 日志创建模式
     *
     * @param title     日志标题
     * @param execption 异常
     */
    LoggerMessage build(String title, Throwable execption);

    /**
     * 日志创建模式
     *
     * @param title   日志标题
     * @param message 日志内容
     */
    LoggerMessage build(String title, Object message);

    /**
     * 日志创建模式
     *
     * @param title 日志标题
     */
    LoggerMessage build(String title);

    /**
     * 日志创建模式 参数化日志
     *
     * @param title
     * @param message
     * @param params
     * @return
     */
    LoggerMessage build(String title, String message, Object... params);
}
